

/******************************************************************************
 * Copyright (C) 2024 EternalChip, Inc.(Gmbh) or its affiliates.
 * 
 * All Rights Reserved.
 * 
 * File name: ec_bsp_aht21_driver.h
 * 
 * Description: Provide the HAL APIs of AHT21 and corresponding opetions.
 * 
 * Processing flow:
 * 
 * call directly.
 * 
 * 
 * Version: V1.0
 * 
 * Modifications:
 * 
 * 
 * Note: 1 tab == 4 spaces!
 * 
 *****************************************************************************/


//******************************** Includes *********************************//

#ifndef BSP_TEMPHUMIDITYMODULE_HANDLER_H
#define BSP_TEMPHUMIDITYMODULE_HANDLER_H
#include <stdint.h>
#include "ec_bsp_aht21_driver.h"
typedef struct{
    uint32_t (*getnowtime)(void);
    void (*os_tick)(uint32_t ms);
	void *handler;
    void (*queue_create)(uint32_t eLength,uint32_t item,void **handler);
    int8_t (*queue_send)(void *item,uint32_t timeout,void *xQueue_handler);
    void (*queue_read)(void *item,uint32_t timeout,void *xQueue_handler);
    void (*semaphorehandle_create)(void);
    void (*xsemaphoreget)(uint32_t timeout);
    void (*xsemaphorefree)(void);
    
}ec_bsp_os_interface_t;


typedef struct{
    iic_driver_interface_t          iic_instance;
    system_timebase_interface_t     timebase_interface;
    ec_bsp_os_interface_t           rtos_yeild;
	uint32_t  index;
}ec_bsp_thermhumiditymodule_handler_public_t;


typedef enum {
    TEMP_HUMI_EVENT_TYPE_TEMP = 0,  // 表示仅温度事件
    TEMP_HUMI_EVENT_TYPE_HUMI,      // 表示仅湿度事件
    TEMP_HUMI_EVENT_TYPE_BOTH       // 表示温度和湿度两者的事件
} temp_humi_t;

typedef struct {
    void *queuehandle;
    float temp;                        // 指向存储温度值
    float humi;                        // 指向存储湿度值
    uint32_t lifetime;                 // 指向存储事件有效生命周期
    uint32_t timestamp;                // 指向存储事件时间戳
    temp_humi_t type_of_data;           // 事件的类型，可以是温度、湿度或两者都有
    void (*callback)(float*, float*);    // 一个回调函数指针，接受一个浮点数和一个浮点数指针作为参数
} temp_humi_event_t;

typedef struct ec_bsp_thermhumiditymodule_handler{
    bsp_aht21_t			            *aht21_instance;
    iic_driver_interface_t          *iic_instance;
    system_timebase_interface_t     *timebase_interface;
    ec_bsp_os_interface_t           *rtos_yeild;

    int8_t (*pfinst)(   struct ec_bsp_thermhumiditymodule_handler 			* ec_bsp_thermhumiditymodule_handler,
    
                        bsp_aht21_t           								* aht21_instance, // AHT21的实体实例

					    iic_driver_interface_t                              * iic_instance,   // IIC的实体实例
					
					    system_timebase_interface_t                         * timebase,       // 时基
					
					    ec_bsp_os_interface_t           					* rtos_yeild                       ); // 构造温湿度模块实例
    int8_t (*pfinit)(struct ec_bsp_thermhumiditymodule_handler * ec_bsp_thermhumiditymodule_handler);
    int8_t (*pfdeinst)(struct ec_bsp_thermhumiditymodule_handler * ec_bsp_thermhumiditymodule_handler);
    int8_t (*pfdeinit)(struct ec_bsp_thermhumiditymodule_handler * ec_bsp_thermhumiditymodule_handler);
    int8_t (*mhumiditymoduledata_send)(struct ec_bsp_thermhumiditymodule_handler * ec_bsp_thermhumiditymodule_handler);
    
}ec_bsp_thermhumiditymodule_handler_t; 

/**
***********************************************************
* @brief 构造handler
* @param  handler，aht21，iic，timetimebase
* @return 
***********************************************************
*/
int8_t thermhumiditymodule_handler_inst(   struct ec_bsp_thermhumiditymodule_handler * ec_bsp_thermhumiditymodule_handler,
    
                        bsp_aht21_t                  * aht21_instance, // AHT21的实体实例

					    iic_driver_interface_t       * iic_instance,   // IIC的实体实例
					
					    system_timebase_interface_t  * timetimebase,       // 时基
					
					    ec_bsp_os_interface_t        * rtos_yeild                       );


/**
***********************************************************
* @brief 创建线程
* @param 
* @return 
***********************************************************
*/

void thermhumiditymodule_thread(void *para);

/**
***********************************************************
* @brief 发送函数
* @param  存储温度和湿度事件数据的结构
* @return 
***********************************************************
*/
int8_t mhumiditymodule_event_read(temp_humi_event_t * event);


#endif

